home *** CD-ROM | disk | FTP | other *** search
/ Express Pd: GALORE / Express Pd Galore - The Amiga PD & Shareware CD (1994)(Express Pd)[!][Amiga-CD32-CDTV].iso / productivity / term / termlocale.c < prev    next >
C/C++ Source or Header  |  1993-07-16  |  6KB  |  363 lines

  1. /*
  2. **    termLocale.c
  3. **
  4. **    Localization support routines
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. extern struct
  13. {
  14.     LONG    as_ID;
  15.     STRPTR    as_Str;
  16. } AppStrings[];
  17.  
  18. extern LONG NumAppStrings;
  19.  
  20.     /* LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn):
  21.      *
  22.      *    Open string translation tables.
  23.      */
  24.  
  25. VOID __regargs
  26. LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn,LONG Version)
  27. {
  28.     if(LocaleBase = (struct LocaleBase *)OpenLibrary("locale.library",38))
  29.     {
  30.         if(LocaleBase -> lb_SysPatches)
  31.         {
  32.             strcpy(ConvNumber,"%lD");
  33.             strcpy(ConvNumber10,"%10lD");
  34.  
  35.             Catalog = OpenCatalog(NULL,CatalogName,
  36.                 OC_BuiltInLanguage,    BuiltIn,
  37.                 OC_BuiltInCodeSet,    0,
  38.                 OC_Version,        Version,
  39.             TAG_DONE);
  40.  
  41.             Locale = OpenLocale(NULL);
  42.         }
  43.         else
  44.         {
  45.             strcpy(ConvNumber,"%ld");
  46.             strcpy(ConvNumber10,"%10ld");
  47.  
  48.             CloseLibrary(LocaleBase);
  49.  
  50.             LocaleBase = NULL;
  51.         }
  52.     }
  53.     else
  54.     {
  55.         strcpy(ConvNumber,"%ld");
  56.         strcpy(ConvNumber10,"%10ld");
  57.     }
  58. }
  59.  
  60.     /* LocaleClose():
  61.      *
  62.      *    Close the translation tables.
  63.      */
  64.  
  65. VOID
  66. LocaleClose()
  67. {
  68.     if(Locale)
  69.     {
  70.         CloseLocale(Locale);
  71.  
  72.         Locale = NULL;
  73.     }
  74.  
  75.     if(Catalog)
  76.     {
  77.         CloseCatalog(Catalog);
  78.  
  79.         Catalog = NULL;
  80.     }
  81.  
  82.     if(LocaleBase)
  83.     {
  84.         CloseLibrary(LocaleBase);
  85.  
  86.         LocaleBase = NULL;
  87.     }
  88. }
  89.  
  90.     /* LanguageCheck():
  91.      *
  92.      *    Checks to see if the currently selected language
  93.      *    is english.
  94.      */
  95.  
  96. VOID
  97. LanguageCheck()
  98. {
  99.     if(Locale && Catalog)
  100.     {
  101.         if(Locale -> loc_LanguageName)
  102.         {
  103.             if(!Stricmp(Locale -> loc_LanguageName,"english.language"))
  104.                 English = TRUE;
  105.             else
  106.                 English = FALSE;
  107.         }
  108.         else
  109.             English = FALSE;
  110.     }
  111.     else
  112.         English = TRUE;
  113. }
  114.  
  115.     /* GadToolsStrlen(STRPTR *String):
  116.      *
  117.      *    Custom version of strlen, useful for gadtools object titles
  118.      *    with embedded underscore characters.
  119.      */
  120.  
  121. WORD __regargs
  122. GadToolsStrlen(STRPTR String)
  123. {
  124.     WORD Len = 0;
  125.  
  126.     while(*String)
  127.     {
  128.         if(*String++ != '_')
  129.             Len++;
  130.     }
  131.  
  132.     return(Len);
  133. }
  134.  
  135.     /* GadToolsLongestString(WORD From,WORD To):
  136.      *
  137.      *    Determines the longest string used by a gadtools
  138.      *    control panel.
  139.      */
  140.  
  141. WORD __regargs
  142. GadToolsLongestString(WORD From,WORD To)
  143. {
  144.     STRPTR    Text;
  145.     WORD    MaxLen = 0,
  146.         Len,i;
  147.  
  148.     for(i = From ; i <= To ; i++)
  149.     {
  150.         if(Text = LocaleString(i))
  151.         {
  152.             if((Len = GadToolsStrlen(Text)) > MaxLen)
  153.                 MaxLen = Len;
  154.         }
  155.     }
  156.  
  157.     return(MaxLen);
  158. }
  159.  
  160.     /* LocaleSeconds(WORD Seconds):
  161.      *
  162.      *    Return seconds in proper format.
  163.      */
  164.  
  165. STRPTR __regargs
  166. LocaleSeconds(WORD Seconds)
  167. {
  168.     STATIC UBYTE Time[10];
  169.  
  170.     if(Locale)
  171.         SPrintf(Time,"%2lD%s%02lD",Seconds / 100,Locale -> loc_DecimalPoint,Seconds % 100);
  172.     else
  173.         SPrintf(Time,"%2ld.%02ld",Seconds / 100,Seconds % 100);
  174.  
  175.     return(Time);
  176. }
  177.  
  178.     /* SmallCurrency():
  179.      *
  180.      *    Support function for the rates control panel, returns a formatted
  181.      *    string to contain a string like "cents/unit".
  182.      */
  183.  
  184. STRPTR __regargs
  185. SmallCurrency()
  186. {
  187.     STATIC UBYTE Buffer[30];
  188.  
  189.     if(Locale)
  190.         SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),Locale -> loc_MonSmallCS);
  191.     else
  192.         SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
  193.  
  194.     return(Buffer);
  195. }
  196.  
  197.     /* CreateSum(LONG Quantity):
  198.      *
  199.      *    Create a string containing a monetary quantity formatted
  200.      *    according to the current locale rules.
  201.      */
  202.  
  203. STRPTR __regargs
  204. CreateSum(LONG Quantity,BYTE UseCurrency)
  205. {
  206.     STATIC UBYTE Buffer[30],Buffer1[30],Buffer2[30];
  207.  
  208.     if(Locale)
  209.     {
  210.         if(Locale -> loc_MonFracDigits < 6)
  211.         {
  212.             STATIC LONG    Power[] = { 1, 10, 100, 1000, 10000, 100000 };
  213.  
  214.             LONG        Int,
  215.                     Frac;
  216.  
  217.             if(UseCurrency)
  218.             {
  219.                 strcpy(Buffer2,"%s %lD%s%");
  220.  
  221.                 SPrintf(&Buffer2[9],"%02ld",Locale -> loc_MonFracDigits);
  222.  
  223.                 strcat(Buffer2,"lD");
  224.  
  225.                 Int    = Quantity / Power[Locale -> loc_MonFracDigits];
  226.                 Frac    = Quantity % Power[Locale -> loc_MonFracDigits];
  227.  
  228.                 SPrintf(Buffer,Buffer2,Locale -> loc_MonCS,Int,Locale -> loc_MonDecimalPoint,Frac);
  229.             }
  230.             else
  231.             {
  232.                 strcpy(Buffer2,"%lD%s%");
  233.  
  234.                 SPrintf(&Buffer2[6],"%02ld",Locale -> loc_MonFracDigits);
  235.  
  236.                 strcat(Buffer2,"lD");
  237.  
  238.                 Int    = Quantity / Power[Locale -> loc_MonFracDigits];
  239.                 Frac    = Quantity % Power[Locale -> loc_MonFracDigits];
  240.  
  241.                 SPrintf(Buffer1,Buffer2,Int,Locale -> loc_MonDecimalPoint,Frac);
  242.  
  243.                 return(Buffer1);
  244.             }
  245.         }
  246.         else
  247.             SPrintf(Buffer,"%lD.%02ld",Quantity / 100,Quantity % 100);
  248.     }
  249.     else
  250.         SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
  251.  
  252.     return(Buffer);
  253. }
  254.  
  255.     /* LocalizeString(STRPTR *Strings,WORD From,WORD To):
  256.      *
  257.      *    Localize an array of strings.
  258.      */
  259.  
  260. VOID __regargs
  261. LocalizeString(STRPTR *Strings,WORD From,WORD To)
  262. {
  263.     WORD i,j;
  264.  
  265.     for(i = From, j = 0 ; i <= To ; i++)
  266.     {
  267.         if(!Strings[j])
  268.             Strings[j++] = LocaleString(i);
  269.     }
  270. }
  271.  
  272.     /* LocalizeMenu(struct NewMenu *Menu,WORD From):
  273.      *
  274.      *    Localize a NewMenu definition.
  275.      */
  276.  
  277. VOID __regargs
  278. LocalizeMenu(struct NewMenu *Menu,WORD From)
  279. {
  280.     STRPTR Label,Shortcut;
  281.  
  282.         while(Menu -> nm_Type != NM_END)
  283.     {
  284.         Shortcut = LocaleString(From);
  285.  
  286.         if(Shortcut[0] && !Shortcut[1])
  287.             Label = Shortcut + 2;
  288.         else
  289.         {
  290.             Label        = Shortcut;
  291.             Shortcut    = NULL;
  292.         }
  293.  
  294.         switch(Menu -> nm_Type)
  295.         {
  296.             case NM_TITLE:
  297.  
  298.                 Menu -> nm_Label = Label;
  299.  
  300.                 From++;
  301.  
  302.                 break;
  303.  
  304.             case NM_ITEM:
  305.             case NM_SUB:
  306.  
  307.                 if(Menu -> nm_Label != NM_BARLABEL)
  308.                 {
  309.                     Menu -> nm_Label    = Label;
  310.                     Menu -> nm_CommKey    = Shortcut;
  311.  
  312.                     From++;
  313.                 }
  314.  
  315.                 break;
  316.         }
  317.  
  318.         Menu++;
  319.     }
  320. }
  321.  
  322.     /* LocaleString(LONG ID):
  323.      *
  324.      *    Obtain a string from the translation pool.
  325.      */
  326.  
  327. STRPTR __regargs
  328. LocaleString(LONG ID)
  329. {
  330.     STRPTR Builtin;
  331.  
  332.     if(ID < NumAppStrings && AppStrings[ID] . as_ID == ID)
  333.         Builtin = AppStrings[ID] . as_Str;
  334.     else
  335.     {
  336.         LONG i;
  337.  
  338.         Builtin = "";
  339.  
  340.         for(i = 0 ; i < NumAppStrings ; i++)
  341.         {
  342.             if(AppStrings[i] . as_ID == ID)
  343.             {
  344.                 Builtin = AppStrings[i] . as_Str;
  345.  
  346.                 break;
  347.             }
  348.         }
  349.     }
  350.  
  351.     if(Catalog)
  352.     {
  353.         STRPTR String = GetCatalogStr(Catalog,ID,Builtin);
  354.  
  355.         if(String[0])
  356.             return(String);
  357.         else
  358.             return(Builtin);
  359.     }
  360.     else
  361.         return(Builtin);
  362. }
  363.